#!/usr/bin/env python
# $Id: test2-34.py df54dec975f4 2012/09/09 20:22:40 pgurumur $
# Copyright (c) 2012 Prabhu Gurumurthy <pgurumur@gmail.com>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

__version__  = "$Revision: df54dec975f4 $"
__author__   = "$Author: pgurumur $"
__modified__ = "$Date: 2012-09-09 20:22:40Z $"

import hashlib
import os
import base64

from Crypto.Cipher import AES
from venya.lib import stdlib

def nrPadBytes(blocksize, size):
   if not (0 < blocksize < 255):
      raise Exception("Blocksize must be between 0 and 255")

   return blocksize - (size % blocksize)

def appendPadding(blocksize, string):
   ix = nrPadBytes(blocksize, len(string))
   return string + (chr(ix) * ix)

def removePadding(blocksize, string):
   ix = ord(string[-1])
   if ix > blocksize or ix > len(string):
      raise Error("Invalid padding")

   return string[:-ix]

key = hashlib.md5("secret").hexdigest()
iv = os.urandom(AES.block_size)

cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = stdlib.GetRandomString(100)
print(plaintext)
plaintext = appendPadding(AES.block_size, plaintext)
ciphertext = cipher.encrypt(plaintext)
# print(base64.b64encode(ciphertext))

cipher = AES.new(key, AES.MODE_CBC, iv)
decryptedtext = cipher.decrypt(ciphertext)
decryptedtext = removePadding(AES.block_size, decryptedtext)
print(decryptedtext)

assert plaintext != decryptedtext, "Uh Oh!"

